package com.liuyucheng.idea_springboot.util;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.*;
import java.util.Enumeration;

/**
 * @Author : JCccc
 * @CreateTime : 2018-11-23
 * @Description :
 * @Point: Keep a good mood
 **/
public class IpUtil {
    public static String getIpAddr(HttpServletRequest request) {
        String ipAddress = null;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (ipAddress.equals("127.0.0.1")) {
                    // 根据网卡取本机配置的IP
                    InetAddress inet = null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割
            if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
                // = 15
                if (ipAddress.indexOf(",") > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress = "";
        }
        // ipAddress = this.getRequest().getRemoteAddr();

        return ipAddress;
    }

    public static String getLocalIp() {
        try {
            Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces();
            InetAddress ip;
            while (allNetInterfaces.hasMoreElements()) {
                NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
                Enumeration addresses = netInterface.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    ip = (InetAddress) addresses.nextElement();
                    if (ip != null && ip instanceof Inet4Address && !"127.0.0.1".equals(ip.getHostAddress())) {
                        return ip.getHostAddress();
                    }
                }
            }
        } catch (Exception e) {
        }
        return null;
    }

    public static String getMac(String ip) throws UnknownHostException, SocketException {
        String macAddress = "";
        String line;
        // 如果为127.0.0.1,则获取本地MAC地址
        if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip) || "localhost".equals(ip) || getLocalIp().equals(ip)) {    //注意getLocalIp().equals(ip)，由于else中的方法获取不到本机ip对应的的mac，所以放到这里，调用的getLocalIp()
            InetAddress inetAddress = InetAddress.getLocalHost();
            byte[] mac = NetworkInterface.getByInetAddress(inetAddress)
                    .getHardwareAddress();
            // 下面代码是把mac地址拼装成String
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < mac.length; i++) {
                if (i != 0) {
                    sb.append("-");
                }
                // mac[i] & 0xFF 是为了把byte转化为正整数
                String s = Integer.toHexString(mac[i] & 0xFF);
                sb.append(s.length() == 1 ? 0 + s : s);
            }
            // 把字符串所有小写字母改为大写成为正规的mac地址并返回
            macAddress = sb.toString().trim().toUpperCase();
            return macAddress;
        } else {    // 获取非本地IP的MAC地址

//            //由于我测试的时候，使用"nbtstat -A " + ip获取不到一些Mac，
//            //所以换成"arp -A " + ip
//            final String MAC_ADDRESS_PREFIX = "MAC Address = ";
//            try {
//                Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);
//                InputStreamReader isr = new InputStreamReader(p.getInputStream());
//                BufferedReader br = new BufferedReader(isr);
//                while ((line = br.readLine()) != null) {
//                    if (line != null) {
//                        int index = line.indexOf(MAC_ADDRESS_PREFIX);
//                        if (index != -1) {
//                            macAddress = line.substring(index + MAC_ADDRESS_PREFIX.length()).trim().toUpperCase();
//                        }
//                    }
//                }
//                br.close();
//            } catch (IOException e) {
//                e.printStackTrace(System.out);
//            }

            try {
                Process p = Runtime.getRuntime().exec("arp -A " + ip);
                InputStreamReader isr = new InputStreamReader(p.getInputStream(), "gbk");
                BufferedReader br = new BufferedReader(isr);
                while ((line = br.readLine()) != null) {
                    System.out.println("line = " + line);
                    if (line != null) {
                        int index = line.indexOf(ip);
                        if (index != -1) {
                            macAddress = line.substring(index + ip.length() + 10, index + ip.length() + 27).trim().toUpperCase();
                        }
                    }
                }
                br.close();
            } catch (IOException e) {
                e.printStackTrace(System.out);
            }
            return macAddress;
        }
    }
}